package com.zzg.datastructure.queue;

/**
 * @Author zhengzg
 * @Date 2022-08-16
 * @Version v1.0
 */
public class ArrayQueue {

    /**
     * 表示数据的最大容器
     */
    private int maxSize;

    /**
     * 队列头
     */
    private int front;

    /**
     * 队列尾
     */
    private int rear;

    /**
     * 存放数据，模拟队列
     */
    private int[] arr;

    public ArrayQueue(int maxSize) {
        this.maxSize = maxSize;
        // 指向队列头部，分析出front是指向队列头的前一个位置
        this.front = -1;
        // 指向队列尾部，指向队列尾的数据（即就是队列最后一个数据）
        this.rear = -1;
        this.arr = new int[maxSize];
    }

    // 判断队列是否满
    public boolean isFull(){
       return rear == maxSize - 1;
    }

    // 判断队列是否为null
    public boolean isEmpty(){
        return rear == front;
    }

    // 添加数据到队列
    public void addQueue(int data){
        // 判断队列是否已经满了
        if (this.isFull()){
            System.out.println("队列满啦，别加了塞不下了！╥﹏╥...");
            return;
        }
        rear++;
        // 加入数据尾指针后移
        arr[rear] = data;
    }

    // 获取队列数据，出队列
    public int getQueue(){
        if (this.isEmpty()){
            throw new RuntimeException("哎，啥也没有！ಥ_ಥ");
        }

        // 取数据头指针后移
        front++;
        return arr[front];
    }

    // 显示队列所有数据
    public void list(){
        // 遍历
        if (this.isEmpty()){
            System.out.println("哎，啥也没有！(￣ε(#￣)");
            return;
        }

        for (int data : arr){
            System.out.printf("%d\t",data);
        }
    }

    // 显示队列的头数据
    public int headQueue(){
        if (this.isEmpty()){
            throw new RuntimeException("哎，啥也没有！(￣ε(#￣)");
        }

        return arr[front + 1];
    }

}
